package com.ccut.xunfeiSpringboot.service.impl;

import com.ccut.xunfeiSpringboot.dto.AnalyseCapabilityDTO;
import com.ccut.xunfeiSpringboot.dto.ChatRequest;
import com.ccut.xunfeiSpringboot.dto.UserAnswerAnalyseDTO;
import com.ccut.xunfeiSpringboot.dto.request.CapabilityAnalyseRequest;
import com.ccut.xunfeiSpringboot.dto.request.MultimodalAnalyseRequest;
import com.ccut.xunfeiSpringboot.model.RoleContent;
import com.ccut.xunfeiSpringboot.service.BaseService;
import com.ccut.xunfeiSpringboot.service.InterviewAnalyseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.net.MalformedURLException;
import java.security.SignatureException;
import java.util.ArrayList;
import java.util.List;

@Service
public class InterviewAnalyseServiceImpl implements InterviewAnalyseService {

    @Autowired
    private BaseService baseService;

    @Override
    public AnalyseCapabilityDTO analyseCapability(CapabilityAnalyseRequest request) throws MalformedURLException, SignatureException {
        ChatRequest chatRequest = new ChatRequest();
        chatRequest.setUserId(Long.valueOf(request.getUserId()));
        List<RoleContent> messages = new ArrayList<>();
        String basePrompt = """
            请基于以下面试数据，生成一份候选人能力分析报告，并按照指定格式返回结果。

                职位: ${jobName}
                职位描述: ${jobDescription}
                岗位要求: ${requirements}
    
                ### 面试记录 ###
                ${interviewRoundsData}
            
                ### 分析要求 ###
                    1. 综合候选人的表现，撰写一段结构化的整体评价（字段 evaluation），包含以下内容：
                        1. 优势：候选人在哪些方面表现突出，令人影响深刻；
                        2. 不足：在哪些知识点或能力维度上存在欠缺，对面试的减分影响较大，如专业知识水平、技能匹配度、语言表达能力、逻辑思维能力、创新能力、应变抗压能力等；
                        3. 总体印象：对候选人的综合判断，需要详细。
                        4. 关键问题定位：如“回答缺乏STAR结构”、“眼神交流不足”
                        5. 与该岗位的匹配程度：基于上述内容，生成候选人与该岗位的匹配程度。                
                    **使用数字编号（1.、2.、3.、4.）分点展示**，并使用换行符 \\n 表示换行。
            
                    2. 对以下五个维度进行评分（每项为 0~100 的整数）：
                    - professionalKnowledge：专业知识掌握程度
                        - skillMatch：技能与岗位要求匹配度
                        - languageExpression：语言表达能力
                        - logicalThinking：逻辑思维能力
                        - stressManagement：抗压与应变能力
            
                    3. 请以标准 JSON 格式返回结果，字段必须包含 evaluation、professionalKnowledge、skillMatch、languageExpression、logicalThinking、stressManagement，且顺序不能更改。
                    4. 不使用任何 Markdown 格式，不添加额外说明或解释性文字。
            
                ### 示例输出格式 ###
                    {
                        "evaluation": "1. 优势:\\n   - 熟悉Spring Boot核心机制\\n   - Redis基本操作掌握较好\\n\\n2. 不足:\\n   - 对分布式事务理解较浅\\n   - 多线程编程经验不足\\n\\n3. 总体印象:\\n   具备基础开发能力，但需进一步成长。\\n\\n4. 被录用的概率：80%",
                            "professionalKnowledge": "85",
                            "skillMatch": "78",
                            "languageExpression": "82",
                            "logicalThinking": "90",
                            "stressManagement": "80"
                    }
                """;
        messages.add(new RoleContent("system", "你是一个精通各种知识的机器人，可以按照下面的信息给我生成知识点之间的关系。"));
        String prompt;
        prompt = basePrompt.replace("${jobName}", request.getJobName());
        prompt = prompt.replace("${jobDescription}", request.getJobDescription());
        prompt = prompt.replace("${requirements}", request.getRequirements());
        prompt = prompt.replace("${interviewRoundsData}", request.getInterviewRoundsData());
        messages.add(new RoleContent("user", prompt));
        chatRequest.setDeepThinking(true);
        chatRequest.setNetworkSearch(false);
        chatRequest.setQuestion("");
        chatRequest.setMessages(messages);
        return baseService.analyseCapability(chatRequest);
    }

    @Override
    public String analyseMultimodal(MultimodalAnalyseRequest request) throws Exception {
        String prompt = "请根据我在面试中的如下表现："+request.getMultimodalData()+"，**使用数字编号（1.、2.、3.、4.）分点展示**，并使用换行符 \\n 表示换行。";
        ChatRequest chatRequest = new ChatRequest();
        chatRequest.setUserId(Long.valueOf(request.getUserId()));
        List<RoleContent> messages = new ArrayList<>();
        messages.add(new RoleContent("system", "你是一个资深的面试官，可以按照下面的信息对用户在面试在用户中的表现进行评分。"));
        messages.add(new RoleContent("user", prompt));
        chatRequest.setDeepThinking(false);
        chatRequest.setNetworkSearch(false);
        chatRequest.setQuestion("");
        chatRequest.setMessages(messages);
        StringBuilder fullContent = new StringBuilder();
        baseService.chatWithStream(chatRequest, fullContent::append);
        return fullContent.toString();
    }

    @Override
    public UserAnswerAnalyseDTO analyseUserAnswer(MultimodalAnalyseRequest request) throws MalformedURLException, SignatureException {
        ChatRequest chatRequest = new ChatRequest();
        chatRequest.setUserId(Long.valueOf(request.getUserId()));
        List<RoleContent> messages = new ArrayList<>();
        messages.add(new RoleContent("system", "你是一个精通各种知识的机器人，可以按照下面的信息给我生成知识点之间的关系。"));
        String basePrompt = """
            请基于以下用户回答的内容数据，生成一份候选人能力分析报告，并按照指定格式返回结果。
        
            用户回答的内容: ${multimodalData}
        
            ### 分析要求 ###
        
            1. 对以下五个维度进行评分（每项为 0~100 的整数）：
                - professionalKnowledge：专业知识掌握程度
                - skillMatch：技能与岗位要求匹配度
                - languageExpression：语言表达能力
                - logicalThinking：逻辑思维能力
                - stressManagement：抗压与应变能力
        
            2. 请对以下五个分析维度进行评分：
                - clarityExpression（清晰度与表达）：
                    - 语言是否简洁易懂？是否避免了不必要的术语、冗长句子和模糊表达？
                    - 结构是否清晰？是否使用了段落、标题、列表等方式组织信息？
                    - 重点是否突出？核心观点是否一目了然？
                    - 流畅度如何？句子与段落之间的衔接是否自然？
        
                - completenessCoverage（完整性与覆盖面）：
                    - 是否全面回答了问题的所有部分？
                    - 是否涵盖了必要的背景信息？
                    - 是否在保证深度的同时兼顾了广度？
                    - 是否提供了足够的细节来支持核心观点？
        
                - depthInsight（深度与洞察力）：
                    - 是否触及问题的本质或核心机制？
                    - 是否提供了独到见解或新颖视角？
                    - 是否展示了批判性思维能力？
                    - 是否能从具体事例中提炼出一般性规律？
        
                - relevanceFocus（相关性与聚焦度）：
                    - 是否紧扣主题？是否存在无关或离题内容？
                    - 是否抓住了问题的核心？
                    - 所引用的信息、例子和论据是否高度相关？
        
                - structureOrganization（结构性与组织性）：
                    - 是否有明确的开头、主体和结尾？
                    - 是否逻辑清晰、层次分明？
                    - 是否使用了合适的段落结构、标题或列表来增强可读性？
                    - 各部分内容是否衔接自然？
        
            3. 请以标准 JSON 格式返回结果，字段必须包含以下内容，且顺序不能更改：
                - clarityExpression
                - completenessCoverage
                - depthInsight
                - relevanceFocus
                - structureOrganization
        
            4. 不使用任何 Markdown 格式，不添加额外说明或解释性文字。
        
            ### 示例输出格式 ###
            {
                "clarityExpression": "85",
                "completenessCoverage": "78",
                "depthInsight": "82",
                "relevanceFocus": "90",
                "structureOrganization": "80"
            }
            """;
        String prompt;
        prompt = basePrompt.replace("${multimodalData}", request.getMultimodalData());
        messages.add(new RoleContent("user", prompt));
        chatRequest.setDeepThinking(true);
        chatRequest.setNetworkSearch(false);
        chatRequest.setQuestion("");
        chatRequest.setMessages(messages);
        return baseService.analyseUserAnswer(chatRequest);
    }
}
